using System;
using System.Data;
using System.Runtime.InteropServices;

namespace Antu.Core.DataAccess
{
    /// <summary>
    /// 通用数据访问接口
    /// </summary>
    public interface IDataAccess
    {
        /// <summary>
        /// 提交更改（带事务时）并关闭数据库连接
        /// </summary>
        void Close();
        /// <summary>
        /// 提交或撤消更改并关闭数据库连接
        /// </summary>
        /// <param name="commit">True则提交,否则撤消</param>
        void Close(bool commit);
        /// <summary>
        /// 检查对应于条件的数据是否存在
        /// </summary>
        /// <param name="tableName">表名</param> 
        /// <param name="where">条件,包括Where语句,如Where a=2 </param>
        /// <returns></returns>
        bool DataExists(string tableName, string where);
        /// <summary>
        /// 执行SQL语句,慎用,尽可能使用存储过程.返回IDataReader
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <returns>IDataReader</returns>
        IDataReader GetDataReader(string sql);
        /// <summary>
        /// 运行SQL语句返回第一行第一个字段的值（字符串形式）
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        string GetValue(string sql);
        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="procName">存储过程的名称</param>
        /// <returns>返回存储过程返回值</returns>
        int RunProc(string procName);
        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="prams">存储过程所需参数</param>
        /// <returns>返回存储过程返回值</returns>
        int RunProc(string procName, ref IDataParameter[] prams);
        /// <summary>
        /// 执行存储过程,将结果以DataSet返回
        /// </summary>
        /// <param name="procName"></param>
        /// <param name="prams"></param>
        /// <param name="ds">返回的数据集</param>
        void RunProc(string procName, ref IDataParameter[] prams, out DataSet ds);
        /// <summary>
        /// 执行存储过程,将结果以DataTable返回
        /// </summary>
        /// <param name="procName"></param>
        /// <param name="prams"></param>
        /// <param name="dt">返回的数据表</param>
        void RunProc(string procName, ref IDataParameter[] prams, out DataTable dt);
        /// <summary>
        /// 执行SQL语句,慎用,尽可能使用存储过程
        /// </summary>
        /// <param name="sql"></param>
        int RunSql(string sql);
        /// <summary>
        /// 执行SQL语句
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="prams">所需参数</param>
        /// <returns>返回存储过程返回值</returns>
        DataTable RunSql(string sql, ref IDataParameter[] prams);
        /// <summary>
        /// 执行SQL语句,慎用,尽可能使用存储过程.以参数ds返回结果集
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <param name="ds">结果集</param>
        /// <returns></returns>
        void RunSql(string sql, out DataSet ds);
        /// <summary>
        /// 执行SQL语句,慎用,尽可能使用存储过程.以参数dt返回结果集
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <param name="dt">结果集</param>
        /// <returns></returns>
        void RunSql(string sql, out DataTable dt);
        /// <summary>
        /// 执行SQL语句,慎用,尽可能使用存储过程.以参数ds返回结果集
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <param name="ds">结果集</param>
        /// <param name="isUpdate">是否支持数据集的更新，如果为True则可以调用本接口中的Update更新数据集</param> 
        /// <returns></returns>
        void RunSql(string sql, out DataSet ds, bool isUpdate);
        /// <summary>
        /// 执行SQL语句,慎用,尽可能使用存储过程.以参数dt返回结果集
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <param name="dt">结果集</param>
        /// <param name="isUpdate">是否支持数据集的更新，如果为True则可以调用本接口中的Update更新数据集</param> 
        /// <returns></returns>
        void RunSql(string sql, out DataTable dt, bool isUpdate);
        /// <summary>
        /// 更新数据集，必须是在调用RunSQL时设了isUpdate=true，否则无意义
        /// </summary>
        /// <param name="dt"></param>
        void Update(DataTable dt);
        /// <summary>
        /// 更新数据集，必须是在调用RunSQL时设了isUpdate=true，否则无意义
        /// </summary>
        /// <param name="ds">要更新到数据库的数据集</param>
        /// <param name="TableName">要更新的表名</param>
        void Update(DataSet ds, string TableName);

        /// <summary>
        /// 联接串
        /// </summary>
        string ConnectionString { get; set; }
    }
}

